<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 满300-30 
        // 满500-60
        // 9折
        // 8折
        // 5折
        function cal_fn(origin, type) {
            // 返回值 最终价格
            if (type === '300-30') {
                return origin - Math.floor(origin / 300) * 30
            }
            else if (type === '500-60') {
                return origin - Math.floor(origin / 500) * 60
            }

            else if (type === '90%') {
                return (origin * 0.9).toFixed(2)
            }

            else if (type === '80%') {
                return (origin * 0.8).toFixed(2)
            }
            else if (type === '50%') {
                return (origin * 0.5).toFixed(2)
            }
        }

        // 上面如果更多的折扣方式  需要继续写分支 
        // 策略模式就是为了解决分支过多的问题 

        // 策略模式 是针对每个策略写一个功能函数  
        function cal_fn2(origin, type) {
            // 返回值 最终价格
            function one(origin) {
                return origin - Math.floor(origin / 300) * 30
            }
            function two(origin) {
                return origin - Math.floor(origin / 500) * 60
            }
            function three(origin) {
                return (origin * 0.9).toFixed(2)
            }
            function four(origin) {
                return (origin * 0.8).toFixed(2)
            }
            function five(origin) {
                return (origin * 0.5).toFixed(2)
            }
            function six(origin) {
                return origin - Math.floor(origin / 800) * 100
            }
        }

        // 上面的写法 并没有好到哪里去 

        // 思考?
        // 既然每个策略一个功能函数
        // 我们可以统一管理
        // 好处:
        //     方面我们添加删除查看 



        // 如何更好的统一管理 
        // 既然一个策略对应一个功能函数 
        // 可以使用对象数据类型 
        // 折扣类型(策略)当做键  功能函数当做值 
        // 对象的键名字的问题 (折扣中有 -  % 属于特殊字符 键名一定要加引号)

        // 300-30 500 -60  800-100  90% 80% 50%
        // const alldata = {
        //     '300-30':function(origin){return origin - Math.floor(origin/300)*30},
        //     '500-60':function(origin){return origin - Math.floor(origin/500)*60},
        //     '800-100':function(origin){return origin - Math.floor(origin/800)*100},
        //     '90%':function(origin){ return (origin * 0.9).toFixed(2)},
        //     '80%':function(origin){ return (origin * 0.8).toFixed(2)},
        //     '50%':function(origin){ return (origin * 0.5).toFixed(2)},
        // }

        // all_data['300-30'](1900)

        // 后期使用 

        // 先判断有没有这个折扣类型 
        // 如果有用  
        // 如果没有 提示没有


        // function cal_fn3(origin,type){
        //     const all_data = {
        //     '300-30':function(origin){return origin - Math.floor(origin/300)*30},
        //     '500-60':function(origin){return origin - Math.floor(origin/500)*60},
        //     '800-100':function(origin){return origin - Math.floor(origin/800)*100},
        //     '90%':function(origin){ return (origin * 0.9).toFixed(2)},
        //     '80%':function(origin){ return (origin * 0.8).toFixed(2)},
        //     '50%':function(origin){ return (origin * 0.5).toFixed(2)},
        //     }
        //     if(!all_data[type]){
        //         alert('抱歉没有这个折扣类型')
        //     }

        //     return all_data[type](origin);// all_data[type]是个函数

        // }

        // console.log(cal_fn3(888,'800-100'));
        // console.log(cal_fn3(666,'90%'));
        // console.log(cal_fn3(1000,'70%'));




        // 我想动态的往对象里边 添加折扣类型  删除折扣类型 

        // 需要延长 all_data的生命周期 
        // 用到闭包  


        // 一切皆对象
        // 函数是对象 

        // 既然是对象 可以给一个新的键赋值一个函数 


        // cal_fn3 仅仅是实现了 获取折扣  
        // cal_fn3 是个函数 也是个对象 
        // cal_fn3加一个属性 add 赋值一个函数 用来all_data中添加
        // cal_fn3加一个属性 remove 赋值一个函数 用来删除all_data键值对 


        const cal_fn3 = (function () {
            const all_data = {
                    '300-30': function (origin) { return origin - Math.floor(origin / 300) * 30 },
                    '500-60': function (origin) { return origin - Math.floor(origin / 500) * 60 },
                    '800-100': function (origin) { return origin - Math.floor(origin / 800) * 100 },
                    '90%': function (origin) { return (origin * 0.9).toFixed(2) },
                    '80%': function (origin) { return (origin * 0.8).toFixed(2) },
                    '50%': function (origin) { return (origin * 0.5).toFixed(2) },
            }
            function cal_fn3(origin, type) {
                
                if (!all_data[type]) {
                    alert('抱歉没有这个折扣类型')
                }

                return all_data[type](origin);

            }

            // '1000-200': function (origin) { return origin - Math.floor(origin / 1000) * 200 }
            cal_fn3.add = function(key,value){
                all_data[key] = value;
            }
            cal_fn3.remove  = function(key){
                delete all_data[key]
            }
            cal_fn3.get  = function(key){
                return all_data
            }





            return cal_fn3
        })();


        // console.dir(cal_fn3);

    cal_fn3.add('1000-200',origin => origin - Math.floor(origin / 1000) * 200 );

    console.log(cal_fn3.get());

    cal_fn3.remove('90%')
    console.log(cal_fn3.get());

    console.log(cal_fn3(1900,'300-30'));





    </script>
</body>

</html>